package elastic.util;

import com.alibaba.fastjson.JSONObject;
import com.css.sword.knowing.search.Searcher;
import org.apache.commons.lang3.StringUtils;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Jeffrey
 * @version 1.0
 * @project 深圳OA
 * @package util
 * @file 创建时间:2018/7/28 17:17
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2018 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @reviewer 审核人
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class SearchFileUtil {

    /**
     * 日志
     */
    Logger log = LoggerFactory.getLogger(SearchFileUtil.class);

    /**
     * 文件路径------转化为文件内容
     * @param filenames filenames
     * @return contents
     */
    public List<String> convertFiles2String(List<String> filenames) {
        if (null == filenames || filenames.size() <= 0) {
            return filenames;
        }

        final List<String> contents = new ArrayList<>();
        for (String filename : filenames) {
            contents.add(convertFile2String(filename));
        }

        return contents;
    }

    /**
     * 文件路径------转化为文件内容
     * @param filename filename
     * @return content
     */
    public String convertFile2String(String filename) {
        return (StringUtils.isNotEmpty(filename)) ? extractContentFromFile(getFileInput(filename.trim())) : "";
    }
    
    /**
     * 从文件服务器下载文件
     * @param file file
     * @return inputStream
     */
    private InputStream getFileInput(String file) {
        InputStream inputStream = null;

        try {
            inputStream = new InputStream() {
                @Override
                public int read() throws IOException {
                    return 20;
                }
            };
        } catch (Exception e) {
            log.info("====添加到检索，从文件服务器取文件时出错====", e);
        }

        return inputStream;
    }

    private List<String> getContext(String keys)
    {
        String[] arr = keys.split(",");
        List<String> list = new ArrayList<String>();
        for(int i=0; i<arr.length; i++)
        {
            String id = arr[i];
            ExtensionTool e = new ExtensionTool();
            String ret = e.fetchContext("files_cache", id, "context");
            
            if(StringUtils.isEmpty(ret))
            {
                ret = e.httpExtract(Searcher.file_url, id, 1024*1024);
            }
            
            if(!StringUtils.isEmpty(ret))
                list.add(ret);
        }
        
        return list;
    }

    public JSONObject AttachExtract(String jsonStr) {

        JSONObject json = (JSONObject) JSONObject.parse(jsonStr);
        
        if(SearchQueryMap.isEmpty(json))
            return json;
        
        String files = json.getString("files");
        if(!StringUtils.isEmpty(files))
        {
            List<String> list = getContext(files);

            if(!list.isEmpty())
                json.put("fj", list);
        }
        
        String zw = json.getString("zw");
        if(!StringUtils.isEmpty(zw))
        {
            List<String> list = getContext(zw);

            if(!list.isEmpty())
                json.put("zw", list);
        }
        
        return json;
    }
    
    /**
     * 从流中提取文件内容
     * @param inputStream inputStream
     * @return content
     */
    private String extractContentFromFile(InputStream inputStream) {
        String content = "";
        final Tika tika = new Tika();

        try {
            content = tika.parseToString(inputStream);
        } catch (IOException | TikaException e) {
            log.info("====添加到检索，提取文件内容时出错====", e);
        }

        return content;
    }
}
